1053ede3ebd65344bfa061f54c5ed736f523c9e3,subprojects/model-core/src/main/java/org/gradle/model/internal/inspect/ManagedModelCreationRuleExtractor.java,ManagedModelCreationRuleExtractor,buildModelCreatorForManagedType,#ModelType#MethodRuleDefinition#ModelPath#,66

Before Change


        List<ModelReference<?>> inputs = bindings.subList(1, bindings.size());
        ModelRuleDescriptor descriptor = ruleDefinition.getDescriptor();

        return ManagedModelCreators.creator(descriptor, modelPath, modelSchema, inputs, new RuleMethodBackedMutationAction<T>(ruleDefinition.getRuleInvoker()));
    }

    private <T> ModelSchema<T> getModelSchema(ModelType<T> managedType, MethodRuleDefinition<?, ?> ruleDefinition) {

After Change


        return new ExtractedModelCreator(buildModelCreatorForManagedType(managedType, ruleDefinition, ModelPath.path(modelName)));
    }

    private <T> ModelCreator buildModelCreatorForManagedType(ModelType<T> managedType, final MethodRuleDefinition<?, ?> ruleDefinition, ModelPath modelPath) {
        ModelSchema<T> modelSchema = getModelSchema(managedType, ruleDefinition);

        if (modelSchema.getKind().equals(ModelSchema.Kind.VALUE)) {
            throw new InvalidModelRuleDeclarationException(ruleDefinition.getDescriptor(), "a void returning model element creation rule cannot take a value type as the first parameter, which is the element being created. Return the value from the method.");
        }

        if (!modelSchema.getKind().isManaged()) {
            String description = "a void returning model element creation rule has to take an instance of a managed type as the first argument";
            throw new InvalidModelRuleDeclarationException(ruleDefinition.getDescriptor(), description);
        }

        List<ModelReference<?>> bindings = ruleDefinition.getReferences();
        List<ModelReference<?>> inputs = bindings.subList(1, bindings.size());
        ModelRuleDescriptor descriptor = ruleDefinition.getDescriptor();

        final ModelReference<T> reference = ModelReference.of(modelPath, managedType);
        return ModelCreators.of(modelPath, modelSchema.getNodeInitializer())
            .descriptor(descriptor)
            .action(ModelActionRole.Initialize, InputUsingModelAction.of(
                    reference, descriptor, inputs, new RuleMethodBackedMutationAction<T>(ruleDefinition.getRuleInvoker())
                )
            )
            .build();
    }

    private <T> ModelSchema<T> getModelSchema(ModelType<T> managedType, MethodRuleDefinition<?, ?> ruleDefinition) {